#ifndef MONITORASCENSORES_H_
#define MONITORASCENSORES_H_

#include <string>
#include "Semaforo.h"
#include "TiposDatos.h"
#include "MemoriaCompartida.h"
#include "Logger.h"


class MonitorAscensores {

private:

	int cantidadAscensores;
	int cantidadPisos;
	int capacidad;
	int velocidad;
	Semaforo* semAscensores;
	MemoriaCompartida<tascensor>* mcAscensores;
	MemoriaCompartida<int>* mcVecAscensores;
	Logger* logger;

	void crearSemaforos();

	void inicializarSem();

	int crearMc();

	void inicializarMc();

	void liberarMc();

	int buscarAscensor(int pisoOrigen, int pisoDestino);

	void log(std::string message);

	void sync(std::string message);

	void debug(std::string message);

public:

	MonitorAscensores(int cantidadAscensores, int cantidadPisos, int capacidad,
			int velocidad);

	virtual ~MonitorAscensores();

	void inicializar();

	void liberarSem();

	/**
	 * Actualiza el piso a false.
	 */
	void arriboPiso(int nroAscensor, int piso);

	/**
	 * Setea al ascensor como abierto
	 */
	void abrir(int nroAscensor);

	/**
	 * Setea al ascensor como cerrado
	 */
	void cerrar(int nroAscensor);

	/**
	 * Lo hace la persona al entrar al ascensor. Es individual.
	 * Actualiza la cantidad de personas, el peso disponible, y
	 * el piso en que tiene que bajarse a true.
	 * @returns el numero de ascensor al que se sube o -1 en
	 * 			caso de que no entre.
	 */
	int subir(int peso, int pisoOrigen, int pisoDestino);

	/**
	 * Lo hace la persona al bajar del ascensor. Es individual.
	 * Actualiza la cantidad de personas, el peso disponible.
	 */
	void bajar(int nroAscensor, int peso);

	/**
	 * Lo usa el Ascensor, el Controlador Central y las Personas para leer el piso del Ascensor.
	 */
	tascensor leer(int nroAscensor);

	/**
	 * Lo usa el Ascensor, el Controlador Central y las Personas para leer el vector de pisos del Ascensor.
	 */
	void leerVector(int nroAscensor, int vector[]);

	/**
	 * Lo usa el Controlador Central.
	 */
	void asignarProximoPiso(int nroAscensor, int proximoPiso, char estado);

};

#endif /* MONITORASCENSORES_H_ */
